#include<stdio.h>
#include<windows.h>
#include<conio.h> //定义全局变量
#include<windows.h>
#include<time.h>

#define high 15
#define width 30 //游戏画面尺寸

int canvas[high][width]={0};//二维数组记录游戏画面中对应的元素
                             //0输出空格，-1输出边界#，1为蛇头@，>1为蛇身*，-2为食物$
int food_x,food_y;         //食物位置-2
int score;      //得分
int moveDirection;    //1,2,3,4分别表示向上下左右

void HideCursor()			//隐藏光标
{
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void gotoxy(int x, int y)		//光标移动到(x,y)位置,清屏函数
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

void startup()		//数据初始化
{
    food_x=rand()%(high-5)+2;     //初始食物位置
    food_y=rand()%(width-5)+2;
    canvas[food_x][food_y]=-2;

    int k;
    for(k=0;k<5;k++)      //初始蛇头蛇尾位置
    {
        canvas[high/2][width/2-k]=k+1;
    }

    for(k=0;k<high;k++)     //初始化边界位置
    {
        canvas[k][0]=-1;
        canvas[k][width-1]=-1;
    }
    for(k=0;k<width;k++){
        canvas[0][k]=-1;
        canvas[high-1][k]=-1;
    }
    //初始化小蛇移动方向向右
    moveDirection=4;

    score=0;

    HideCursor();    //隐藏光标

}
void show()				//显示界面
{
    gotoxy(0,0);
    int i,j;
    for(i=0;i<high;i++)
    {
        for (j=0;j<width;j++)
        {

            if(canvas[i][j]==-1)
                printf("#");//输出边界
            else if(canvas[i][j]==1)
                printf("@");//输出蛇头
            else if(canvas[i][j]>1)
                printf("*");//输出蛇身
            else if(canvas[i][j]==-2)
                printf("$");//输出食物
            else
                printf(" ");//输出空格
        }
        printf("\n");
    }
    printf("得分：%d\n",score);
    Sleep(300);
}

void updateWithInpute()
//与用户输入有关的更新
{
    char input;

    if(kbhit())
    {
        input=getch();      //当按键时执行
        if(input=='a')
        {
            moveDirection=3;
        }
        else if(input=='d')
        {
            moveDirection=4;
        }
       else if(input=='s')
        {
            moveDirection=2;
        }
        else if(input=='w')
        {
            moveDirection=1;
        }
    }
}
void moveSnakeDirection()
{
    int i,j;
    int max=0;
    int oldTail_i,oldTail_j;//记录旧蛇尾
    int oldHead_i,oldHead_j;//记录旧蛇头位置
    int newHead_i,newHead_j;//定义新蛇头

    for(i=1;i<high-1;i++)
    {
        for(j=1;j<width-1;j++)
        {
            if(canvas[i][j]>0)
            {
                //对所有蛇头蛇身的元素+1
                canvas[i][j]++;
                //记录最大值max和旧蛇尾位置;
                if(max<canvas[i][j])
                {
                    max=canvas[i][j];
                    oldTail_i=i;
                    oldTail_j=j;
                }
                //记录旧蛇头位置
                if(canvas[i][j]==2)
                {
                    oldHead_i=i;
                    oldHead_j=j;
                }
            }
        }
    }
       // canvas[oldTail_i][oldTail_j]=0;//最大值所在元素变为0

        if(moveDirection==1)    //向上
        {//记旧蛇头上面的位置为1，即新蛇头
           // canvas[oldHead_i-1][oldHead_j]=1;
            newHead_i=oldHead_i-1;
            newHead_j=oldHead_j;
        }
        if(moveDirection==2)    //向下
        {
            //canvas[oldHead_i+1][oldHead_j]=1;
            newHead_i=oldHead_i+1;
            newHead_j=oldHead_j;
        }
        if(moveDirection==3)    //向左
        {
           // canvas[oldHead_i][oldHead_j-1]=1;
            newHead_i=oldHead_i;
            newHead_j=oldHead_j-1;
        }
        if(moveDirection==4)    //向右
        {
            //canvas[oldHead_i][oldHead_j+1]=1;
            newHead_i=oldHead_i;
            newHead_j=oldHead_j+1;
        }
        //以下判断新蛇头位置带来的后果
        //如果碰到食物
        if(canvas[newHead_i][newHead_j]==-2)
        {
            canvas[food_x][food_y]=0;//食物位置归0，即空格
            food_x=rand()%(high-5)+2;     //读入新的食物
            food_y=rand()%(width-5)+2;
            canvas[food_x][food_y]=-2;
            score++;
        }
        else
        {//没有吃到，旧蛇尾变为0
            canvas[oldTail_i][oldTail_j]=0;
        }
        //判断小蛇蛇头撞到边框或者自身时游戏失败
        if(canvas[newHead_i][newHead_j]>1 || canvas[newHead_i][newHead_j]==-1)
        {
            printf("Game Over!\n");
            exit(0);
        }
        else//若游戏未结束则将新蛇头位置的值换成1
        {
            canvas[newHead_i][newHead_j]=1;
        }
}

int main()
{
    int i,j;
	startup();
	while (1)
	{
		show();
		//显示界面
		//updateWithoutInpute();
		moveSnakeDirection();
		//与用户输入无关的更新
		updateWithInpute();	        //与用户输入有关的更新
	}
	return 0;
}